package testes;

import java.util.GregorianCalendar;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

import controller.BolaoFacade;


import util.StatusJogo;
import bean.Bolao;
import bean.Jogador;
import bean.Jogo;
import bean.Palpite;
import bean.Rodada;

public class PontuacaoTest {
	
	private BolaoFacade bolaoFacade;
	private Bolao bolao;
	
	@Before
	public void setUp() throws Exception{
		bolao = new Bolao();
		bolaoFacade = new BolaoFacade(bolao);
	}
	
	@Test
	public void testPontuacao() throws Exception{
		
		Jogador jogador1 = new Jogador ("Daniel", "20/05", "Campina Grande", "Brasil", "danielfariasleite@gmail.com", "123456");
		Jogador jogador2 = new Jogador ("Matheus", "14/01", "Campina Grande", "Brasil", "matheus1401@gmail.com", "654321");
		Jogador jogador3 = new Jogador ("Claudio", "25/06", "Aracaju", "Brasil", "claudiocaj@gmail.com", "1234");
		
		bolaoFacade.adicionaJogador(jogador1);
		bolaoFacade.adicionaJogador(jogador2);
		bolaoFacade.adicionaJogador(jogador3);
		
		Rodada r1 = new Rodada();
		Rodada r2 = new Rodada();
		Rodada r3 = new Rodada();
		
		Jogo jogo1 = new Jogo("Brasil", "Holanda", new GregorianCalendar());
		Jogo jogo2 = new Jogo("Brasil", "Chile", new GregorianCalendar());
		Jogo jogo3 = new Jogo("Brasil", "Portugal", new GregorianCalendar());
		
		r1.adicionaJogo(jogo1);
		r1.adicionaJogo(jogo2);
		r1.adicionaJogo(jogo3);
		
		bolaoFacade.adicionaRodada(r1);
		
		Palpite palpite1 = new Palpite(3, 0, jogador1);
		Palpite palpite2 = new Palpite(1, 0, jogador2);
		Palpite palpite3 = new Palpite(1, 2, jogador3);
		
		jogo1.addPalpite(palpite1);
		jogo1.addPalpite(palpite2);
		jogo1.addPalpite(palpite3);
		
		Palpite palpite4 = new Palpite(3, 0, jogador1);
		Palpite palpite5 = new Palpite(1, 0, jogador2);
		Palpite palpite6 = new Palpite(1, 2, jogador3);
		
		jogo2.addPalpite(palpite4);
		jogo2.addPalpite(palpite5);
		jogo2.addPalpite(palpite6);
		
		Palpite palpite7 = new Palpite(3, 0, jogador1);
		Palpite palpite8 = new Palpite(1, 0, jogador2);
		Palpite palpite9 = new Palpite(1, 2, jogador3);
		
		jogo3.addPalpite(palpite7);
		jogo3.addPalpite(palpite8);
		jogo3.addPalpite(palpite9);
		
		jogo1.setGolsA(1);
		jogo1.setGolsB(2);
		jogo1.setStatusDoJogo(StatusJogo.FECHADO_COM_RESULTADO);
		jogo2.setGolsA(3);
		jogo2.setGolsB(0);
		jogo2.setStatusDoJogo(StatusJogo.FECHADO_COM_RESULTADO);
		jogo3.setGolsA(0);
		jogo3.setGolsB(0);
		jogo3.setStatusDoJogo(StatusJogo.FECHADO_COM_RESULTADO);
		
		bolaoFacade.atualizaPontuacao();
		//testa a pontuacao da rodada r1.
		Assert.assertEquals("Pontuacao diferente", 5, jogador1.calculaPontuacaoRodada(r1.getIdentificador()));
		Assert.assertEquals("Pontuacao diferente", 5, jogador2.calculaPontuacaoRodada(r1.getIdentificador()));
		Assert.assertEquals("Pontuacao diferente", 4, jogador3.calculaPontuacaoRodada(r1.getIdentificador()));
		
		Jogo jogo4 = new Jogo("Alemanha", "Gana", new GregorianCalendar());
		Jogo jogo5 = new Jogo("EUA", "Servia", new GregorianCalendar());
		Jogo jogo6 = new Jogo("França", "Inglaterra", new GregorianCalendar());
		
		r2.adicionaJogo(jogo4);
		r2.adicionaJogo(jogo5);
		r2.adicionaJogo(jogo6);
		
		bolaoFacade.adicionaRodada(r2);
		
		Palpite palpite10 = new Palpite(2, 2, jogador1);
		Palpite palpite11 = new Palpite(1, 0, jogador2);
		Palpite palpite12 = new Palpite(0, 2, jogador3);
		
		jogo4.addPalpite(palpite10);
		jogo4.addPalpite(palpite11);
		jogo4.addPalpite(palpite12);
		
		Palpite palpite13 = new Palpite(2, 2, jogador1);
		Palpite palpite14 = new Palpite(1, 0, jogador2);
		Palpite palpite15 = new Palpite(0, 2, jogador3);
		
		jogo5.addPalpite(palpite13);
		jogo5.addPalpite(palpite14);
		jogo5.addPalpite(palpite15);
		
		Palpite palpite16 = new Palpite(2, 2, jogador1);
		Palpite palpite17 = new Palpite(1, 0, jogador2);
		Palpite palpite18 = new Palpite(0, 2, jogador3);
		
		jogo6.addPalpite(palpite16);
		jogo6.addPalpite(palpite17);
		jogo6.addPalpite(palpite18);
		
		jogo4.setGolsA(1);
		jogo4.setGolsB(0);
		jogo4.setStatusDoJogo(StatusJogo.FECHADO_COM_RESULTADO);
		jogo5.setGolsA(2);
		jogo5.setGolsB(2);
		jogo5.setStatusDoJogo(StatusJogo.FECHADO_COM_RESULTADO);
		jogo6.setGolsA(0);
		jogo6.setGolsB(3);
		jogo6.setStatusDoJogo(StatusJogo.FECHADO_COM_RESULTADO);
		
		bolaoFacade.atualizaPontuacao();
		//testa a pontuacao da rodada r2.
		Assert.assertEquals("Pontuacao diferente", 4, jogador1.calculaPontuacaoRodada(r2.getIdentificador()));
		Assert.assertEquals("Pontuacao diferente", 4, jogador2.calculaPontuacaoRodada(r2.getIdentificador()));
		Assert.assertEquals("Pontuacao diferente", 4, jogador3.calculaPontuacaoRodada(r2.getIdentificador()));
		//testa a pontuacao total.
		Assert.assertEquals("Pontuacao diferente", 9, jogador1.calculaPontuacaoGeral());
		Assert.assertEquals("Pontuacao diferente", 9, jogador2.calculaPontuacaoGeral());
		Assert.assertEquals("Pontuacao diferente", 8, jogador3.calculaPontuacaoGeral());
		
		Jogo jogo7 = new Jogo("Argentina", "Alemanha", new GregorianCalendar());
		Jogo jogo8 = new Jogo("Paraguai", "Espanha", new GregorianCalendar());
		Jogo jogo9 = new Jogo("Uruguai", "Gana", new GregorianCalendar());
		
		r3.adicionaJogo(jogo7);
		r3.adicionaJogo(jogo8);
		r3.adicionaJogo(jogo9);
		
		bolaoFacade.adicionaRodada(r3);
		
		Palpite palpite19 = new Palpite(0, 4, jogador1);
		Palpite palpite20 = new Palpite(0, 1, jogador2);
		Palpite palpite21 = new Palpite(2, 1, jogador3);
		
		jogo7.addPalpite(palpite19);
		jogo7.addPalpite(palpite20);
		jogo7.addPalpite(palpite21);
		
		Palpite palpite22 = new Palpite(0, 4, jogador1);
		Palpite palpite23 = new Palpite(0, 1, jogador2);
		Palpite palpite24 = new Palpite(2, 1, jogador3);
		
		jogo8.addPalpite(palpite22);
		jogo8.addPalpite(palpite23);
		jogo8.addPalpite(palpite24);
		
		Palpite palpite25 = new Palpite(0, 4, jogador1);
		Palpite palpite26 = new Palpite(0, 1, jogador2);
		Palpite palpite27 = new Palpite(2, 1, jogador3);
		
		jogo9.addPalpite(palpite25);
		jogo9.addPalpite(palpite26);
		jogo9.addPalpite(palpite27);
		
		jogo7.setGolsA(0);
		jogo7.setGolsB(4);
		jogo7.setStatusDoJogo(StatusJogo.FECHADO_COM_RESULTADO);
		jogo8.setGolsA(0);
		jogo8.setGolsB(1);
		jogo8.setStatusDoJogo(StatusJogo.FECHADO_COM_RESULTADO);
		jogo9.setGolsA(1);
		jogo9.setGolsB(1);
		jogo9.setStatusDoJogo(StatusJogo.FECHADO_COM_RESULTADO);
		
		bolaoFacade.atualizaPontuacao();
		
		//testa a pontuacao da rodada r3.
		Assert.assertEquals("Pontuacao diferente", 7, jogador1.calculaPontuacaoRodada(r3.getIdentificador()));
		Assert.assertEquals("Pontuacao diferente", 8, jogador2.calculaPontuacaoRodada(r3.getIdentificador()));
		Assert.assertEquals("Pontuacao diferente", 2, jogador3.calculaPontuacaoRodada(r3.getIdentificador()));
		//testa a pontuacao total.
		Assert.assertEquals("Pontuacao diferente", 16, jogador1.calculaPontuacaoGeral());
		Assert.assertEquals("Pontuacao diferente", 17, jogador2.calculaPontuacaoGeral());
		Assert.assertEquals("Pontuacao diferente", 10, jogador3.calculaPontuacaoGeral());
	}



}
